ホームに戻る
出典 :
Property {Get|Let|Set} ステートメント|VBA入門 PropertyのSetはLetでも良い|VBA技術解説
目次 :

VBAにおけるプロパティ

モジュール(オブジェクト)外部に対しては変数、内部に対してはメソッドとして振る舞うプロシージャのこと。C#などのプロパティと共通の概念である。
モジュール外からは変数のように、値の取得・設定が簡便に行える。
クラスモジュール、フォーム、標準モジュールのいずれにもプロパティ(カスタムプロパティ)を作成することができる。

プロパティの例

Range("A1").Valueの Value は Range オブジェクトのプロパティである。
この Value プロパティは値の取得・設定が可能であるが、取得・設定のいずれかのみが可能なものも存在する。
カスタムプロパティにおいても取得(Get)・設定(Let / Set)を自由に定義することができる。

カスタムプロパティの定義例

対象がオブジェクト以外(プリミティブ型)

SomeClass.cls (クラスモジュール)
Option Explicit ' プロパティで取得・設定する実体 Private m_Text As String ' 値の取得(Get) Public Property Get Text() As String ' m_Text の値を返す Text = m_Text End Property ' 値の設定(Let) Public Property Let Text(val As String) ' m_Text に書き戻す m_Text = val End Property
SomeModule.bas (標準モジュール)
Option Explicit Private Sub DoSomething() Dim sc As New SomeClass ' Text プロパティに値を設定 (Let を呼び出す) sc.Text = "テスト" Dim ttt ' Text プロパティの値を取得 (Get を呼び出す) ttt = sc.Text End Sub
上記は、基本的なカスタムプロパティの定義例である。
ここで「プリミティブ型」は数値型や文字列など、オブジェクト(クラス)以外を指す。
Get と Let のプロシージャ名(Text)を同一とすることで、一対のプロパティとして関連付けることができる。
この場合 Get の戻り値と Let の引数は型が同じでないとエラーとなる点に注意。

対象がオブジェクト

SomeClass.cls (クラスモジュール)
Option Explicit ' プロパティで取得・設定する実体 Private m_Obj As Object ' オブジェクト参照の取得(Get) Public Property Get Obj() As Object ' m_Obj (への参照)を返す Set Obj = m_Obj End Property ' オブジェクト参照の設定(Set) Public Property Set Obj(val As Object) ' m_Obj に書き戻す Set m_Obj = val End Property
SomeModule.bas (標準モジュール)
Option Explicit Private Sub DoSomething() Dim sc As New SomeClass ' Obj プロパティに値を設定 (Set を呼び出す) Set sc.Obj = New OtherClass Dim ttt As Object ' Obj プロパティの値を取得 (Get を呼び出す) Set ttt = sc.Obj End Sub
プリミティブ型では値の設定に Let を用いていたが、オブジェクトでは Set を用いる点が異なる。

余談

オブジェクトを対象とする場合、Property Set ではなく Property Let で定義しても問題なく動作する。
その場合は呼び出す際に Set ではなく Let を付与する。
ただ混乱のもととなりかねないため、特段の事情が無い限りは Set を用いるほうが望ましい。